package rauguelu.lectorrss;

import java.util.List;

import rauguelu.programaEventos.R;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.preference.PreferenceManager;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;

public class MainActivity extends Activity {
	
	// IDs de los menus
	private static final int MNU_UPDTE = 1;
	private static final int MNU_PREFS = 2;
	private static final int MNU_SALIR = 3;
	
	// Controles
	private ListView lstNoticias;
	
	// Variables de nuestra aplicacion
	private List <Noticia> noticias;

	// Para el dialogo de progreso es necesaria una variable global porque iniciamos el 
	// dialogo en una funcion y lo ocultamos en otra
	private ProgressDialog progressDialog;
	
	/**
	 * Android nos presenta la restricciones que no podemos alterar los elementos de interfaz 
	 * grafica en un hilo de ejecucion que no sea el principal por lo que es necesario utilizar 
	 * un manejador(Handler) para enviar un mensaje de un hilo a otro cuando la carga de datos
	 * haya terminado.
	 */		
    private final Handler progressHandler = new Handler() {
		public void handleMessage(Message msg) {
			actualizarListView();
			progressDialog.dismiss();
        }
    };
	
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.noticias);

        // Obtenemos referencias a los controles
        lstNoticias = (ListView)findViewById(R.id.LstNoticias);
        
        // Asignamos el evento a la lista de noticias
        lstNoticias.setOnItemClickListener(new OnItemClickListener() {
    	    public void onItemClick(AdapterView<?> a, View v, int position, long id) {
    	    	// Si hay al menos una noticia
    	    	if(noticias.size()>0){
	    			// Creamos el nuevo Intent al que llamaremos
    	    		Intent intent = new Intent(MainActivity.this, DetalleNoticiaActivity.class);
    	    		
    	    		// Creamos el objeto Bundle para pasarle la informacion
    	    		Bundle bundle = new Bundle();
    	            bundle.putString("Descripcion", noticias.get(position).getDescripcion());
    	            bundle.putString("Fecha", noticias.get(position).getFecha());
    	            bundle.putString("Guid", noticias.get(position).getGuid());
    	            bundle.putString("Link", noticias.get(position).getLink());
    	            bundle.putString("Titulo", noticias.get(position).getTitulo());
    	            intent.putExtras(bundle);
    	            
    	            // Llamamos a la actividad
    	            startActivity(intent);
    	    	}
    	    }
    	});
        
        // Obtenemos la lista de noticias por primera vez llamando a este metodo
        actualizarNoticias();
    }
    
    // Metodo necesario para hacer que no se reinicie la actividad al rotar la pantalla
    // Hay que aniadir la siguiente linea en la actividad en el fichero Manifest
    // android:configChanges="keyboard|keyboardHidden|orientation"
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
    }

	// Establecemos el menu
    public boolean onCreateOptionsMenu(Menu menu) {
    	// Boton Actualizar
    	menu.add(Menu.NONE, MNU_UPDTE, Menu.NONE, "Actualizar").setIcon(
    			android.R.drawable.ic_menu_today);
    	// Boton Preferencias
    	menu.add(Menu.NONE, MNU_PREFS, Menu.NONE, "Preferencias").setIcon(
    			android.R.drawable.ic_menu_preferences);
    	// Boton Salir
    	menu.add(Menu.NONE, MNU_SALIR, Menu.NONE, "Portada").setIcon(
    			android.R.drawable.ic_menu_close_clear_cancel);
    	
		return true;
    }
    
    // Asignamos los eventos del menu
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        	// Actualizar: Recargamos las noticias
        	case MNU_UPDTE:
        		this.actualizarNoticias();
        		return true;
    		// Preferencias: Mostramos el menu de preferencias
        	case MNU_PREFS:
        		startActivity(new Intent(MainActivity.this, PantallaPreferencias.class));
        		return true;
        	// Salir: Finalizamos la aplicacion
	        case MNU_SALIR:
	            this.finish();
	            return true;
            // Por defecto devolvemos el valor de la superclase
	        default:
	            return super.onOptionsItemSelected(item);
        }	
    }
    
    // Metodo para recargar las noticias
    private void actualizarNoticias() {
    	// Lanzamos un evento de ProgressDialog para hacer esperar al usuario
    	progressDialog = ProgressDialog.show(MainActivity.this,
    			"", 
				"Cargando Noticias...");
		
    	// Lanzamos la hebra para que el ProgressDialog sea visible
		new Thread(new Runnable(){
			public void run() {
				// Obtenemos la fuente RSS
				SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(
						MainActivity.this);	
				String fuenteRSS = pref.getString("opcion1", "http://www.europapress.es/rss/rss.aspx");
				
				// Para probar en el trabajo he aniadido el segundo argumento al constructor 
				// de la clase RssParserSax2. Quitar luego.
				//RssParserSax2 ep = new RssParserSax2(fuenteRSS, MainActivity.this.getResources());    
				RssParserSax2 ep = new RssParserSax2(fuenteRSS);
			     	
				// Analizamos el fichero XML para obtener las noticias
				noticias = ep.parse(); 
				
				// Llamamos al progressHandler para que actualice el ListView
				progressHandler.sendEmptyMessage(0);
			}
		}).start();
	}
    
    // Metodo que actualiza la ListView con las noticias actuales
    private void actualizarListView(){
     	// Adaptamos las noticias a la celda del ListView
		AdaptadorTitulares adaptador = new AdaptadorTitulares(this);
		lstNoticias.setAdapter(adaptador);
    }
    
    // Clase para inflar el ListView
    class AdaptadorTitulares extends ArrayAdapter <Noticia> {
   	 
    	Activity context;
     
    	AdaptadorTitulares(Activity context) {
    	    super(context, R.layout.noticias_item, noticias);
    	    this.context = context;
    	}
     
    	public View getView(int position, View convertView, ViewGroup parent) {
    		View item = convertView;
    		ViewHolder holder;
    		
    		// Si la vista no se puede reutilizar (para optimizar recursos)
    		// entonces obtenemos la referencia a la celda del ListView
    		if(item == null){
    			LayoutInflater inflater = context.getLayoutInflater();
                item = inflater.inflate(R.layout.noticias_item, null);
                
                holder = new ViewHolder();
                holder.titulo = (TextView)item.findViewById(R.id.LblTitulo);
                holder.descripcion = (TextView)item.findViewById(R.id.LblDescripcion);
         
                // Establecemos en la vista las referencias a las etiquetas
                item.setTag(holder);
    		}
    		else {
    			holder = (ViewHolder)item.getTag();
    		}
    		
    		// Establecemos la celda del ListView con los datos correctos
            holder.titulo.setText(noticias.get(position).getTitulo());
            holder.descripcion.setText(noticias.get(position).getFecha());
     
            return(item);
        }
    }
    
    // Clase estatica para almacenar los elementos que forman una celda del ListView
    static class ViewHolder {
    	TextView titulo;
    	TextView descripcion;
    }
}
